package com.pb.infra.oth.exception;

import lombok.Getter;

import java.io.Serializable;

public class ErrorCode implements Serializable {

    public static final String OK = new ErrorCode(ErrorType.NONE, ErrorLevel.NONE, "0").toString();

    public static final String INVALID_ARG = new ErrorCode(ErrorType.BIZ, ErrorLevel.WARN, "B001").toString();

    @Getter
    private ErrorType errorType;

    @Getter
    private ErrorLevel errorLevel;

    @Getter
    private String code;

    public ErrorCode(ErrorType errorType, ErrorLevel errorLevel, String code) {
        this.errorType = errorType;
        this.errorLevel = errorLevel;
        this.code = code;
    }

    public static String buildCode(ErrorType errorType, ErrorLevel errorLevel, String code) {
        return new ErrorCode(errorType, errorLevel, code).toString();
    }

    @Override
    public String toString() {
        return String.format("%s%s%s", this.errorType.code, this.errorLevel.code, this.code);
    }

    public enum ErrorType {
        /**
         * None Error
         */
        NONE("0"),
        /**
         * 系统/框架错误
         */
        SYSTEM("1"),
        /**
         * 业务级错误
         */
        BIZ("2"),
        /**
         * 第三方服务错误
         */
        THIRD("3");
        private String code;

        ErrorType(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }
    }

    public enum ErrorLevel {
        /**
         * None Error
         */
        NONE("0"),
        /**
         * 系统/框架错误
         */
        FALT("1"),
        /**
         * 业务级错误
         */
        ERROR("2"),
        /**
         * 第三方服务错误
         */
        WARN("3");

        private String code;

        ErrorLevel(String code) {
            this.code = code;
        }

    }

    /**
     * 异常信息
     */
    @Getter
    public enum ErrorCodeEnum {

        ACCESS_PARAMS_ERROR("600", "parameter is error"), // 应用认证参数错误

        ACCESS_TOKEN_INVALID("601", "tokenId invalid"), // tokenId无效

        ACCESS_TOKEN_EXPIRE("602", "tokenId expired"), // tokeId已过期

        //ACCESS_SIGN_ERROR("603", "sign error"), // sign校验错误

        ACCESS_USER_INFO("500", "缺失用户信息"),//缺失用户信息 missing user information

        ACCESS_USER_EXIST("501", "用户不存在"),//用户不存在 user not exist

        ACCESS_SIGN_ERROR("502", "密码错误"),//用户名或密码错误 Incorrect user name or password

        ACCESS_TOKEN_ERROR("503", "缺失密码信息"),//缺失密码信息 Incorrect user password

        ACCESS_USER_ROLE("504", "未找到该用户的角色信息，请联系管理员进行配置"),//未找到该用户的角色信息，请联系管理员进行配置 role information for this user was not found

        ACCESS_TABLE_KEY("505", "违反唯一性约束，主键重复"),

        ACCESS_DATA_EXIST("506", "数据不存在"),

        ACCESS_SYS_DATA("507", "系统管理员信息配置错误"),

        ACCESS_SYS_ID("508", "用户编号和登录号不能使用sysadmin"),

        ACCESS_ROLE_NAME("509", "角色名称重复"),

        ACCESS_USER_LOCK("510", "用户已锁定，请联系管理员解锁"),

        ACCESS_USER_DEL("511", "用户已删除，请联系管理员恢复"),

        ACCESS_PASS_TIME("512", "密码过期"),

        ACCESS_ASS_NAME("513", "名称重复"),

        ACCESS_IDENT_ID("514", "系统生成序号数据缺失"),

        ACCESS_USER_KEY("515", "该用户编号已存在"),

        ACCESS_OTH_USER_KEY("516", "该用户编号已存在与其他法人"),

        USER_FORBID("517", "该用户没有操作权限"),

        ACT_NAME_NOT_NULL("518", "考试活动名称不能为空"),

        ACT_TYPE_NOT_NULL("519", "考试活动类型不能为空"),

        LIB_QUESTIONCOUNT_NOT_NULL("520", "题目数不能为空"),

        SET_NO_NOT_NULL("521", "套题编号不能为空"),

        START_TIME_NOT_NULL("522", "开始时间不能为空"),

        END_TIME_NOT_NULL("523", "结束时间不能为空"),

        EXAM_USER_NOT_NULL("524", "考试用户不能为空"),

        EXAM_TIMES_NOT_NULL("525", "创建次数不能为空"),

        ACT_NO_NOT_NULL("526", "考试活动主键不能为空"),

        EXAM_ACT_NOT_NULL("527", "考试活动不存在"),

        DELETE_LIST_NOT_NULL("528", "删除列表不能为空"),

        PARAM_ERROR("529", "请求参数异常"),

        ACT_IS_NULL("530", "活动不存在"),

        ACT_USER_IS_NULL("531", "活动用户不存在"),

        ACT_IS_NOT_START("532", "活动未开始"),

        ACT_IS_LATE("533", "活动当前已结束"),

        ACT_QUESTION_LIB_COUNT_ERROR("534", "活动考题数量异常"),

        ACT_IS_FINISH("535", "活动当前已完成"),

        ACT_SET_IS_NULL("536", "活动套题不存在"),

        ACT_NO_PERMISSION("537", "活动考题答案无法查看"),

        PAPER_SET_NAME_NULL("538", "套题名称不能为空"),

        PAPER_SET_NO_NULL("539", "套题编号不能为空"),

        QUESTION_RIGHT_ANSWER_ERROR("540", "题目正确答案不存在于题目选项中或正确答案顺序有误"),

        QUESTION_CONTENT_LENGTH_ERROR("541", "题目选项至少两项"),

        QUESTION_OPTION_SIGN_NOT_NULL("542", "题目选项标识不能为空"),

        QUESTION_NO_NOT_NULL("543", "题目主键不能为空"),

        QUESTION_NOT_NULL("544", "题目问题不能为空"),

        QUESTION_TYPE_NOT_NULL("545", "题目类型不能为空"),

        QUESTION_SCORE_NOT_NULL("546", "题目分数不能为空"),

        DELETE_SET_NOT_NULL("547", "套题列表不能为空"),

        FILE_EMPTY_ERROR("548", "导入文件为空"),

        QUESTION_CATALOG_NOT_NULL("549", "题目分类不能为空"),

        EXAM_NOT_NULL("550", "题目不存在"),

        ACT_IS_ACTION("551", "删除的题目中有已被正在进行的活动使用"),

        FILE_ERROR("552", "文件读取失败"),

        QUESTION_OPTION_NOT_NULL("553", "题目选项不能为空"),

        REPEAT_ENNAME("554", "菜单编码重复"),

        ILLEGAL_INTERFACE("591", "该请求没有权限"),

        SESSION_EXPIRED("590", "用户信息失效")
        ;

        private String code;

        private String message;

        ErrorCodeEnum(String code, String message) {
            this.code = code;
            this.message = message;
        }
    }
}
